<html>
<head>
  <title>python DS</title>
  <basefont face="微软雅黑" size="2" />
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  <meta name="exporter-version" content="Evernote Windows/307027 (zh-CN, DDL); Windows/6.1.0 (Win32);"/>
  <style>
    body, td {
      font-family: 微软雅黑;
      font-size: 10pt;
    }
  </style>
</head>
<body>
<a name="667"/>
<h1>python DS</h1>

<div>
<span><div><h2><span><font style="font-size: 16pt; color: rgb(28, 51, 135);">列表</font></span></h2><div><span>Python中列表是可变的，这是它区别于字符串和元组的最重要的特点，一句话概括即：列表可以修改，而字符串和元组不能。</span></div><div><span style="-en-paragraph: true;">以下是 Python 中列表的方法：</span></div><div><br/></div><table><colgroup><col></col><col></col></colgroup><tbody><tr><td><div>方法</div></td><td><div>描述</div></td></tr><tr><td><div>list.append(x)</div></td><td><div>把一个元素添加到列表的结尾，相当于 a[len(a):] = [x]。</div></td></tr><tr><td><div>list.extend(L)</div></td><td><div>通过添加指定列表的所有元素来扩充列表，相当于 a[len(a):] = L。</div></td></tr><tr><td><div>list.insert(i, x)</div></td><td><div>在指定位置插入一个元素。第一个参数是准备插入到其前面的那个元素的索引，例如 a.insert(0, x) 会插入到整个列表之前，而 a.insert(len(a), x) 相当于 a.append(x) 。</div></td></tr><tr><td><div>list.remove(x)</div></td><td><div>删除列表中值为 x 的第一个元素。如果没有这样的元素，就会返回一个错误。</div></td></tr><tr><td><div>list.pop([i])</div></td><td><div>从列表的指定位置删除元素，并将其返回。如果没有指定索引，a.pop()返回最后一个元素。元素随即从列表中被删除。（方法中 i 两边的方括号表示这个参数是可选的，而不是要求你输入一对方括号，你会经常在 Python 库参考手册中遇到这样的标记。）</div></td></tr><tr><td><div>list.clear()</div></td><td><div>移除列表中的所有项，等于del a[:]。</div></td></tr><tr><td><div>list.index(x)</div></td><td><div>返回列表中第一个值为 x 的元素的索引。如果没有匹配的元素就会返回一个错误。</div></td></tr><tr><td><div>list.count(x)</div></td><td><div>返回 x 在列表中出现的次数。</div></td></tr><tr><td><div>list.sort()</div></td><td><div>对列表中的元素进行排序。</div></td></tr><tr><td><div>list.reverse()</div></td><td><div>倒排列表中的元素。</div></td></tr><tr><td><div>list.copy()</div></td><td><div>返回列表的浅复制，等于a[:]。</div></td></tr></tbody></table><div><br/></div><h2>将列表当做堆栈使用</h2><div><span style="-en-paragraph: true;">列表方法使得列表可以很方便的作为一个堆栈来使用，堆栈作为特定的数据结构，最先进入的元素最后一个被释放（后进先出）。用 append() 方法可以把一个元素添加到堆栈顶。用不指定索引的 pop() 方法可以把一个元素从堆栈顶释放出来。</span></div><div style="box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;-en-codeblock:true;"><div>&gt;&gt;&gt; stack = [3, 4, 5]</div><div>&gt;&gt;&gt; stack.append(6)</div><div>&gt;&gt;&gt; stack.append(7)</div><div>&gt;&gt;&gt; stack</div><div>[3, 4, 5, 6, 7]</div><div>&gt;&gt;&gt; stack.pop()</div><div>7</div><div>&gt;&gt;&gt; stack</div><div>[3, 4, 5, 6]</div></div><div><br/></div><h2>将列表当作队列使用</h2><div><span style="-en-paragraph: true;">也可以把列表当做队列用，只是在队列里第一加入的元素，第一个取出来；但是拿列表用作这样的目的效率不高。在列表的最后添加或者弹出元素速度快，然而在列表里插入或者从头部弹出速度却不快（因为所有其他的元素都得一个一个地移动）。</span></div><div style="box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;-en-codeblock:true;"><div><span style="font-family: Monaco; font-size: 9pt; color: rgb(51, 51, 51);">&gt;&gt;&gt; from collections import deque</span></div><div><span style="font-family: Monaco; font-size: 9pt; color: rgb(51, 51, 51);">&gt;&gt;&gt; queue = deque([&quot;Eric&quot;, &quot;John&quot;, &quot;Michael&quot;])</span></div><div><span style="font-family: Monaco; font-size: 9pt; color: rgb(51, 51, 51);">&gt;&gt;&gt; queue.append(&quot;Terry&quot;) # Terry arrives</span></div><div><span style="font-family: Monaco; font-size: 9pt; color: rgb(51, 51, 51);">&gt;&gt;&gt; queue.append(&quot;Graham&quot;) # Graham arrives</span></div><div><span style="font-family: Monaco; font-size: 9pt; color: rgb(51, 51, 51);">&gt;&gt;&gt; queue.popleft() # The first to arrive now leaves</span></div><div><span style="font-family: Monaco; font-size: 9pt; color: rgb(51, 51, 51);">'Eric'</span></div><div><span style="font-family: Monaco; font-size: 9pt; color: rgb(51, 51, 51);">&gt;&gt;&gt; queue.popleft() # The second to arrive now leaves</span></div><div><span style="font-family: Monaco; font-size: 9pt; color: rgb(51, 51, 51);">'John'</span></div><div><span style="font-family: Monaco; font-size: 9pt; color: rgb(51, 51, 51);">&gt;&gt;&gt; queue # Remaining queue in order of arrival</span></div><div><span style="font-family: Monaco; font-size: 9pt; color: rgb(51, 51, 51);">deque(['Michael', 'Terry', 'Graham'])</span></div></div><div><br/></div><h2>嵌套列表解析</h2><div style="-en-paragraph: true; margin-top: 1em; margin-bottom: 1em;"><span style="-en-paragraph: true;">Python的列表还可以嵌套。</span></div><div style="-en-paragraph: true; margin-top: 1em; margin-bottom: 1em;"><span style="-en-paragraph: true;">以下实例展示了3X4的矩阵列表：</span></div><div style="box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;-en-codeblock:true;"><div>&gt;&gt;&gt; matrix = [</div><div>...     [1, 2, 3, 4],</div><div>...     [5, 6, 7, 8],</div><div>...     [9, 10, 11, 12],</div><div>... ]</div></div><div style="-en-paragraph: true; margin-top: 1em; margin-bottom: 1em;"><span style="-en-paragraph: true;">以下实例将3X4的矩阵列表转换为4X3列表：</span></div><div style="box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;-en-codeblock:true;"><div>&gt;&gt;&gt; [[row[i] for row in matrix] for i in range(4)]</div><div>[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]</div></div><div style="-en-paragraph: true; margin-top: 1em; margin-bottom: 1em;"><span style="-en-paragraph: true;">以下实例也可以使用以下方法来实现：</span></div><div style="box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;-en-codeblock:true;"><div>&gt;&gt;&gt; transposed = []</div><div>&gt;&gt;&gt; for i in range(4):</div><div>...     transposed.append([row[i] for row in matrix])</div><div>...</div><div>&gt;&gt;&gt; transposed</div><div>[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]</div></div><div><br/></div><div><br/></div><h2><font style="font-size: 16pt; color: rgb(28, 51, 135);">元组和序列</font></h2><div><span style="-en-paragraph: true;">元组由若干逗号分隔的值组成，例如：</span></div><div style="box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;-en-codeblock:true;"><div>&gt;&gt;&gt; t = 12345, 54321, 'hello!'</div><div>&gt;&gt;&gt; t[0]</div><div>12345</div><div>&gt;&gt;&gt; t</div><div>(12345, 54321, 'hello!')</div><div>&gt;&gt;&gt; # Tuples may be nested:</div><div>... u = t, (1, 2, 3, 4, 5)</div><div>&gt;&gt;&gt; u</div><div>((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))</div></div><div><span style="-en-paragraph: true;">如你所见，元组在输出时总是有括号的，以便于正确表达嵌套结构。在输入时可能有或没有括号， 不过括号通常是必须的（如果元组是更大的表达式的一部分）。</span></div><div><br/></div><div><br/></div><h2><font style="font-size: 16pt; color: rgb(28, 51, 135);">集合</font></h2><div><span style="-en-paragraph: true;">集合是一个无序不重复元素的集。基本功能包括关系测试和消除重复元素。</span></div><div><span style="-en-paragraph: true;">可以用大括号({})创建集合。注意：如果要创建一个空集合，你必须用 set() 而不是 {} ；后者创建一个空的字典，下一节我们会介绍这个数据结构。</span></div><div style="box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;-en-codeblock:true;"><div>&gt;&gt;&gt; basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}</div><div>&gt;&gt;&gt; print(basket)                      # 删除重复的</div><div>{'orange', 'banana', 'pear', 'apple'}</div><div>&gt;&gt;&gt; 'orange' in basket                 # 检测成员</div><div>True</div><div>&gt;&gt;&gt; 'crabgrass' in basket</div><div>False</div><div><br/></div><div>&gt;&gt;&gt; # 以下演示了两个集合的操作</div><div>...</div><div>&gt;&gt;&gt; a = set('abracadabra')</div><div>&gt;&gt;&gt; b = set('alacazam')</div><div>&gt;&gt;&gt; a                                  # a 中唯一的字母</div><div>{'a', 'r', 'b', 'c', 'd'}</div><div>&gt;&gt;&gt; a - b                              # 在 a 中的字母，但不在 b 中</div><div>{'r', 'd', 'b'}</div><div>&gt;&gt;&gt; a | b                              # 在 a 或 b 中的字母</div><div>{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}</div><div>&gt;&gt;&gt; a &amp; b                              # 在 a 和 b 中都有的字母</div><div>{'a', 'c'}</div><div>&gt;&gt;&gt; a ^ b                         # 在 a 或 b 中的字母，但不同时在 a 和 b 中</div><div><br/></div><div>{'r', 'd', 'b', 'm', 'z', 'l'}</div><div><br/></div></div><div><br/></div><h2><font style="font-size: 16pt; color: rgb(28, 51, 135);">字典</font></h2><div style="-en-paragraph: true; margin-top: 1em; margin-bottom: 1em;"><span style="-en-paragraph: true;">另一个非常有用的 Python 内建数据类型是字典。</span></div><div style="-en-paragraph: true; margin-top: 1em; margin-bottom: 1em;"><span style="-en-paragraph: true;">序列是以连续的整数为索引，与此不同的是，字典以关键字为索引，关键字可以是任意不可变类型，通常用字符串或数值。</span></div><div style="-en-paragraph: true; margin-top: 1em; margin-bottom: 1em;"><span style="-en-paragraph: true;">理解字典的最佳方式是把它看做无序的键=&gt;值对集合。在同一个字典之内，关键字必须是互不相同。</span></div><div><span style="-en-paragraph: true;">一对大括号创建一个空的字典：{}。</span></div><div>#方法                                  #描述 </div><div>------------------------------------------------------------------------------------------------- </div><div>D.clear()                              #移除D中的所有项 </div><div>D.copy()                               #返回D的副本 </div><div>D.fromkeys(seq[,val])                  #返回从seq中获得的键和被设置为val的值的字典。可做类方法调用 </div><div>D.get(key[,default])                   #如果D[key]存在，将其返回；否则返回给定的默认值None </div><div>D.has_key(key)                         #检查D是否有给定键key </div><div>D.items()                              #返回表示D项的(键，值)对列表 </div><div>D.iteritems()                          #从D.items()返回的(键，值)对中返回一个可迭代的对象 </div><div>D.iterkeys()                           #从D的键中返回一个可迭代对象 </div><div>D.itervalues()                         #从D的值中返回一个可迭代对象 </div><div>D.keys()                               #返回D键的列表 </div><div>D.pop(key[,d])                         #移除并且返回对应给定键key或给定的默认值D的值 </div><div>D.popitem()                            #从D中移除任意一项，并将其作为(键，值)对返回 </div><div>D.setdefault(key[,default])            #如果D[key]存在则将其返回；否则返回默认值None </div><div>D.update(other)                        #将other中的每一项加入到D中。 </div><div>D.values()                             #返回D中值的列表</div><div><br/></div></div><div><span style="-en-paragraph: true; font-weight: bold;">二、创建字典的五种方法</span></div><div>方法一: 常规方法   </div><div><br/></div><div style="box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;-en-codeblock:true;"><div># 如果事先能拼出整个字典，则此方法比较方便</div><div>&gt;&gt;&gt; D1 = {'name':'Bob','age':40}</div></div><div><br/></div><div>方法二: 动态创建</div><div><span style="line-height: 1.45;">                 </span><br/></div><div style="box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;-en-codeblock:true;"><div># 如果需要动态地建立字典的一个字段，则此方法比较方便</div><div>&gt;&gt;&gt; D2 = {}</div><div>&gt;&gt;&gt; D2['name'] = 'Bob'</div><div>&gt;&gt;&gt; D2['age']  =  40</div><div>&gt;&gt;&gt; D2</div><div>{'age': 40, 'name': 'Bob'}</div></div><div><br/></div><div>方法三:  dict--关键字形式      </div><div><br/></div><div style="box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;-en-codeblock:true;"><div># 代码比较少，但键必须为字符串型。常用于函数赋值</div><div>&gt;&gt;&gt; D3 = dict(name='Bob',age=45)</div><div>&gt;&gt;&gt; D3</div><div>{'age': 45, 'name': 'Bob'}</div></div><div><br/></div><div>方法四: dict--键值序列</div><div><br/></div><div style="box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;-en-codeblock:true;"><div># 如果需要将键值逐步建成序列，则此方式比较有用,常与zip函数一起使用</div><div>&gt;&gt;&gt; D4 = dict([('name','Bob'),('age',40)])</div><div>&gt;&gt;&gt; D4</div><div>{'age': 40, 'name': 'Bob'</div></div><div>或</div><div style="box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;-en-codeblock:true;"><div>&gt;&gt;&gt; D = dict(zip(('name','bob'),('age',40)))</div><div>&gt;&gt;&gt; D</div><div>{'bob': 40, 'name': 'age'}</div></div><div><br/></div><div>方法五: dict--fromkeys方法# 如果键的值都相同的话,用这种方式比较好，并可以用fromkeys来初始化</div><div><br/></div><div style="box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;-en-codeblock:true;"><div>&gt;&gt;&gt; D5 = dict.fromkeys(['A','B'],0)</div><div>&gt;&gt;&gt; D5</div><div>{'A': 0, 'B': 0}</div></div><div><br/></div></span>
</div></body></html> 